/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-10</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.persistence.domain.query ;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.hy.enterprise.framework.lang.pair.Pair;
import com.hy.enterprise.framework.persistence.domain.query.internal.AliasFactory;

/**
 * <ul>
 * <li>设计作者：刘川</li>
 * <li>设计日期：2009-8-10</li>
 * <li>设计时间：下午03:45:38</li>
 * <li>设计目的：排序子句实现类</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
public class OrderByClause extends AbstractClause
{
	private final List < Pair < Object , SortDirection >>	sortInstructions	=
	                                                                              new ArrayList < Pair < Object , SortDirection >> ( ) ;

	/**
	 * 构造函数
	 * 
	 * @param previousClause
	 */
	public OrderByClause (
	                       AbstractClause previousClause )
	{
		super (
		        previousClause ) ;
	}

	/**
	 * 构造函数
	 * 
	 * @param previousClause
	 * @param firstInstruction
	 * @param sortDirection
	 */
	public OrderByClause (
	                       AbstractClause previousClause ,
	                       Object firstInstruction ,
	                       SortDirection sortDirection )
	{
		super (
		        previousClause ) ;
		this.sortInstructions
		                     .add ( new Pair < Object , SortDirection > (
		                                                                  firstInstruction ,
		                                                                  sortDirection ,
		                                                                  false ) ) ;
	}

	/**
	 * @see com.hy.enterprise.framework.persistence.domain.query.AbstractClause#addTo(java.lang.StringBuilder)
	 */
	@ Override
	StringBuilder addTo (
	                      StringBuilder stringBuilder )
	{
		stringBuilder
		             .append ( " ORDER BY " ) ;

		int index =
		            0 ;
		for ( Pair < Object , SortDirection > inst : this.sortInstructions )
		{
			stringBuilder
			             .append ( AliasFactory
			                                   .about (
			                                            inst.key )
			                                   .getTargetRepresentation ( ) ) ;
			stringBuilder
			             .append (
			                       " " )
			             .append (
			                       inst.value.stringForm ) ;
			if ( ++ index < this.sortInstructions
			                                     .size ( ) )
			{
				stringBuilder
				             .append ( ", " ) ;
			}
		}
		return stringBuilder ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:47:16</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Character character )
	{
		return this
		           .andThenBy (
		                        character ,
		                        SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:47:39</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Character character ,
	                                 SortDirection sortDirection )
	{
		this.sortInstructions
		                     .add ( new Pair < Object , SortDirection > (
		                                                                  character ,
		                                                                  sortDirection ,
		                                                                  false ) ) ;
		return this ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:48:26</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Date date )
	{
		return this
		           .andThenBy (
		                        date ,
		                        SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:48:43</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Date date ,
	                                 SortDirection sortDirection )
	{
		this.sortInstructions
		                     .add ( new Pair < Object , SortDirection > (
		                                                                  date ,
		                                                                  sortDirection ,
		                                                                  false ) ) ;
		return this ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:48:53</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Number number )
	{
		return this
		           .andThenBy (
		                        number ,
		                        SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:49:06</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @param dir
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 Number number ,
	                                 SortDirection dir )
	{
		this.sortInstructions
		                     .add ( new Pair < Object , SortDirection > (
		                                                                  number ,
		                                                                  dir ,
		                                                                  false ) ) ;
		return this ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:47:50</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 String string )
	{
		return this
		           .andThenBy (
		                        string ,
		                        SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午03:48:13</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause andThenBy (
	                                 String string ,
	                                 SortDirection sortDirection )
	{
		this.sortInstructions
		                     .add ( new Pair < Object , SortDirection > (
		                                                                  string ,
		                                                                  sortDirection ,
		                                                                  false ) ) ;
		return this ;
	}
}
